﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Timers;

namespace FileSystemControls
{
    //public delegate void CompletedEventHandler(object sender, FileSystemEventArgs argEventArgs);
    //public delegate void CacheTimerElapsedEventHandler(object sender, CacheTimerElapsedEventArgs argEventArgs);

    //public class FileItemWatcher : IDisposable
    //{
    //    #region ** Member Variables **

    //    public event CacheTimerElapsedEventHandler CacheTimerElapsed;

    //    private bool _disposed;
    //    private FileSystemWatcher _internalWatcher;

    //    //private System.Timers.Timer _internalCacheTimer;
    //    private List<string> _filenameList;

    //    #endregion

    //    #region ** Properties **
    //    public string ParentName { get; set; }

    //    public bool EnableRaisingEvents
    //    {
    //        get
    //        {
    //            return _internalWatcher.EnableRaisingEvents;
    //        }
    //        set
    //        {
    //            _internalWatcher.EnableRaisingEvents = value;
    //        }
    //    }

    //    public string Filter
    //    {
    //        get
    //        {
    //            return _internalWatcher.Filter;
    //        }
    //        set
    //        {
    //            _internalWatcher.Filter = value;
    //        }
    //    }

    //    public bool IncludeSubdirectories
    //    {
    //        get
    //        {
    //            return _internalWatcher.IncludeSubdirectories;
    //        }
    //        set
    //        {
    //            _internalWatcher.IncludeSubdirectories = value;
    //        }
    //    }

    //    public int InternalBufferSize
    //    {
    //        get
    //        {
    //            return _internalWatcher.InternalBufferSize;
    //        }
    //        set
    //        {
    //            _internalWatcher.InternalBufferSize = value;
    //        }
    //    }

    //    public NotifyFilters NotifyFilter
    //    {
    //        get
    //        {
    //            return _internalWatcher.NotifyFilter;
    //        }
    //        set
    //        {
    //            _internalWatcher.NotifyFilter = value;
    //        }
    //    }

    //    public string Path
    //    {
    //        get
    //        {
    //            return _internalWatcher.Path;
    //        }
    //        set
    //        {
    //            _internalWatcher.Path = value;
    //        }
    //    }

    //    #endregion

    //    private FileItemWatcher()
    //    {
    //        _internalWatcher = new FileSystemWatcher();
    //        _internalWatcher.IncludeSubdirectories = false;

    //        _internalWatcher.Changed += FileActivity;
    //        _internalWatcher.Created += FileActivity;
    //        _internalWatcher.Deleted += FileActivity;
    //        _internalWatcher.Error += OnError;
    //        _internalWatcher.Renamed += RenameActivity;

    //        _filenameList = new List<string>();

    //        //_internalCacheTimer = new System.Timers.Timer();
    //        //_internalCacheTimer.Elapsed += new ElapsedEventHandler(OnCacheTimerElapsed);
    //        //_internalCacheTimer.AutoReset = false;
    //        //_internalCacheTimer.Enabled = false;
    //    }

    //    public FileItemWatcher(string path)
    //        : this()
    //    {
    //        _internalWatcher.Path = path;
    //    }

    //    public FileItemWatcher(string path, string filter)
    //        : this()
    //    {
    //    }

    //    public void Dispose()
    //    {
    //        Dispose(true);

    //        GC.SuppressFinalize(this);
    //    }

    //    protected virtual void Dispose(bool CodeDisposing)
    //    {
    //        if (!this._disposed)
    //        {
    //            if (!CodeDisposing)
    //            {
    //                _disposed = true;
    //                return;
    //            }

    //            //Make sure we are disposing of everything
    //            _internalWatcher.EnableRaisingEvents = false;
    //            _internalWatcher.Dispose();
    //            _internalWatcher = null;

    //            //_internalCacheTimer.Enabled = false;
    //            //_internalCacheTimer.Stop();
    //            //_internalCacheTimer.Dispose();
    //            //_internalCacheTimer = null;

    //            //Would call the base.Dispose, but I don't have one.

    //            _disposed = true;
    //        }
    //    }

    //    void OnCacheTimerElapsed(object sender, ElapsedEventArgs argEventArgs)
    //    {
    //        //_internalCacheTimer.Enabled = false;
    //        //_internalCacheTimer.Stop();

    //        CacheTimerElapsedEventArgs CurrentArgs = new CacheTimerElapsedEventArgs();
    //        CurrentArgs.FilenameList = _filenameList;

    //        CacheTimerElapsedEventHandler localhandler = CacheTimerElapsed;
    //        if (localhandler != null)
    //        {
    //            localhandler(this, CurrentArgs);
    //        }
    //    }

    //    private void FileActivity(object sender, FileSystemEventArgs argEventArgs)
    //    {

    //        lock (_filenameList)
    //        {
    //            //Add filename to list
    //            if (!_filenameList.Contains(e.FullPath))
    //            {
    //                _filenameList.Add(e.FullPath);
    //            }

    //            ResetTimerDelegate ResetMethod = new ResetTimerDelegate(ResetTimer);
    //            ResetMethod.Invoke();
    //        }
    //    }

    //    private delegate void ResetTimerDelegate();

    //    private void ResetTimer()
    //    {
    //        //_internalCacheTimer.Stop();
    //        //_internalCacheTimer.Interval = 500;
    //        //_internalCacheTimer.Enabled = true;
    //        //_internalCacheTimer.Start();
    //    }

    //    protected void OnError(object sender, ErrorEventArgs argEventArgs)
    //    {
    //    }

    //    protected void RenameActivity(object sender, RenamedEventArgs argEventArgs)
    //    {
    //        FileSystemEventArgs PassedArgs = new FileSystemEventArgs(WatcherChangeTypes.Renamed, e.FullPath, e.Name);
    //        FileActivity(sender, PassedArgs);
    //    }

    //}

    //public class CacheTimerElapsedEventArgs : EventArgs
    //{
    //    public List<string> FilenameList { get; set; }
    //}
}
